package br.com.site;

import java.util.ArrayList;
import java.util.List;

import model.Equipamento;
import model.Equipe;
import model.Instituicao;
import model.PDI;
import model.Veiculo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;

public class NovoVeiculo extends Activity{
	
	private List<Equipamento> listaEquipamentos;
	private List<Equipe> listaEquipes;
	private List<Instituicao> listaInstituicoes;
	
	private TableLayout tlVeiDelete;
	private TableRow trSubtipoVeiculo;
	
	private EditText etVeiIdentificacao;
	private Spinner spVeiTipoDeVeiculo, spVeiSubtipo, spVeiEquipamento, spVeiEquipe, spVeiInst;
	private ImageButton salvar;
	private TextView tvTit;
	
	private ArrayAdapter<CharSequence> adtVeiSubAmb, adtVeiSubAer, adtVeiSubTer, adtVeiSubAqu;
	private ArrayAdapter<CharSequence> adtVeiTipo;
	private ArrayAdapter<CharSequence> adtVeiEquipamento, adtVeiEquipe, adtVeiInst;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.novo_veiculo);
		
		carregaViews();
		
		tlVeiDelete.setVisibility(View.GONE);
		trSubtipoVeiculo.setVisibility(View.GONE);
		
		setPDIArrayAdapter(adtVeiEquipamento, spVeiEquipamento, listaEquipamentos);
		setPDIArrayAdapter(adtVeiEquipe, spVeiEquipe, listaEquipes);
		setPDIArrayAdapter(adtVeiInst, spVeiInst, listaInstituicoes);
        
        if(!Global.editarPDI) novoPDI();
        else editarPDI();
        
	}
	
	private void carregaViews(){
		listaEquipamentos = br.com.site.MainActivity.listaEquipamentos;
		listaEquipes = br.com.site.MainActivity.listaEquipes;
		listaInstituicoes = br.com.site.MainActivity.listaInstituicoes;
		
		tlVeiDelete = (TableLayout) findViewById(R.novo_veiculo.tlVeiDelete);
		trSubtipoVeiculo = (TableRow) findViewById(R.novo_veiculo.trSubTipoVeiculo);
		
		etVeiIdentificacao = (EditText) findViewById(R.novo_veiculo.etVeiIdentificacao);
		
		spVeiTipoDeVeiculo = (Spinner) findViewById(R.novo_veiculo.spVeiTipoDeVeiculo);
		spVeiSubtipo = (Spinner) findViewById(R.novo_veiculo.spVeiSubtipo);
		spVeiEquipamento = (Spinner) findViewById(R.novo_veiculo.spVeiEquipamento);
		spVeiEquipe = (Spinner) findViewById(R.novo_veiculo.spVeiEquipe);
		spVeiInst = (Spinner) findViewById(R.novo_veiculo.spVeiInst);
		
		salvar = (ImageButton) findViewById(R.novo_veiculo.veiSalvar);
		
		tvTit = (TextView) findViewById(R.novo_veiculo.tvVeiTit);
		
		adtVeiSubAmb = ArrayAdapter.createFromResource(this, R.array.veiculoAmbulancia_array, R.layout.textviewmodelo);
        adtVeiSubAmb.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        adtVeiSubAer = ArrayAdapter.createFromResource(this, R.array.veiculoAereo_array, R.layout.textviewmodelo);
        adtVeiSubAer.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        adtVeiSubTer = ArrayAdapter.createFromResource(this, R.array.veiculoTerrestre_array, R.layout.textviewmodelo);
        adtVeiSubTer.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        adtVeiSubAqu = ArrayAdapter.createFromResource(this, R.array.veiculoAquatico_array, R.layout.textviewmodelo);
        adtVeiSubAqu.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        adtVeiTipo = ArrayAdapter.createFromResource(this, R.array.veiculoTipo_array, R.layout.textviewmodelo);
		adtVeiTipo.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spVeiTipoDeVeiculo.setAdapter(adtVeiTipo);
	}
	
	private void novoPDI(){
		spVeiTipoDeVeiculo.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				if (arg0.getSelectedItem().toString().equals("Desconhecido")){
					trSubtipoVeiculo.setVisibility(View.GONE);
				}else if(arg0.getSelectedItem().toString().equals("Ambulância")){
					spVeiSubtipo.setAdapter(adtVeiSubAmb);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
				}else if(arg0.getSelectedItem().toString().equals("Veículo Aéreo")){
					spVeiSubtipo.setAdapter(adtVeiSubAer);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
				}else if(arg0.getSelectedItem().toString().equals("Veículo de Socorro Terrestre")){
					spVeiSubtipo.setAdapter(adtVeiSubTer);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
				}else if(arg0.getSelectedItem().toString().equals("Veículo de Socorro Aquático")){
					spVeiSubtipo.setAdapter(adtVeiSubAqu);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
				}
				
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {}
			
		});
    	
    	
    	salvar.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				salvar.setImageResource(R.drawable.bt_aplicar);
				GeoPoint temp = new GeoPoint(0, 0);
				String identif = etVeiIdentificacao.getText().toString();
				String tipo = spVeiTipoDeVeiculo.getSelectedItem().toString();
				String subtipoVei = "Desconhecido";
				if (!spVeiTipoDeVeiculo.getSelectedItem().equals("Desconhecido")){
					subtipoVei = spVeiSubtipo.getSelectedItem().toString();
				}
				
				
				Equipe eqp = null;
				for (Equipe e : listaEquipes) {
					if (spVeiEquipe.getSelectedItem().equals(e.toString())){
						eqp = e;
					}else{
						continue;
					}
				}
				
				Equipamento eqm = null;
				for (Equipamento equip : listaEquipamentos) {
					if (spVeiEquipamento.getSelectedItem().equals(equip.toString())){
						eqm = equip;
					}else{
						continue;
					}
				}
				
				Instituicao in = null;
				for (Instituicao i : listaInstituicoes) {
					if (spVeiInst.getSelectedItem().equals(i.toString())){
						in = i;
					}else{
						continue;
					}
				}
				
				String textoBalao = subtipoVei;
				
				if (in != null) textoBalao += ", " + in.getTipoDeInstituicao();
				if (eqm != null) textoBalao += "\nEquipamento: " + eqm.toString();
				if (eqp != null) textoBalao += "\nEquipe: " + eqp.toString();
				
				Veiculo car = new Veiculo(temp,
						identif, textoBalao,
						eqm, eqp,
						identif, tipo, subtipoVei, in);
				
				if(eqm != null) eqm.setVeiculo(car);
				
				MainActivity.objetoPassado = car;
				Global.novoPdi = true;
				finish();
				MainActivity.exibeToast(getApplicationContext(), "Toque na tela para posicionar o veículo.");
			}
		});
	}
	
	private void editarPDI(){
		salvar.setImageResource(R.drawable.bt_edit);
    	tvTit.setText("Editar Veículo");
    	tlVeiDelete.setVisibility(View.VISIBLE);
    	
    	final TextView tvDel = (TextView) findViewById(R.novo_veiculo.tvDelVei);
    	final ImageView ivDel = (ImageView) findViewById(R.novo_veiculo.ivDelVei);
    	
    	final Veiculo v = (Veiculo) Global.pdiEdicao;
    	
    	tvDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(v);
			}
		});
    	
    	ivDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(v);
			}
		});

    	
    	spVeiTipoDeVeiculo.setOnItemSelectedListener(new OnItemSelectedListener() {
    		String sub = v.getSubtipo();
    		
			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1,
					int arg2, long arg3) {
				if (arg0.getSelectedItem().toString().equals("Desconhecido")){
					trSubtipoVeiculo.setVisibility(View.GONE);
				}else if(arg0.getSelectedItem().toString().equals("Ambulância")){
					spVeiSubtipo.setAdapter(adtVeiSubAmb);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
					setAdapterPositionFromString(adtVeiSubAmb,spVeiSubtipo,sub);
				}else if(arg0.getSelectedItem().toString().equals("Veículo Aéreo")){
					spVeiSubtipo.setAdapter(adtVeiSubAer);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
					setAdapterPositionFromString(adtVeiSubAer,spVeiSubtipo,sub);
				}else if(arg0.getSelectedItem().toString().equals("Veículo de Socorro Terrestre")){
					spVeiSubtipo.setAdapter(adtVeiSubTer);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
					setAdapterPositionFromString(adtVeiSubTer,spVeiSubtipo,sub);
				}else if(arg0.getSelectedItem().toString().equals("Veículo de Socorro Aquático")){
					spVeiSubtipo.setAdapter(adtVeiSubAqu);
					trSubtipoVeiculo.setVisibility(View.VISIBLE);
					setAdapterPositionFromString(adtVeiSubAqu,spVeiSubtipo,sub);
				}
				
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {}
			
		});
    	
    	
    	etVeiIdentificacao.setText(v.getIdentificacao());
    	setAdapterPositionFromString(spVeiTipoDeVeiculo,v.getTipoDeVeiculo());
    	
    	try{
    		setAdapterPositionFromString(spVeiInst,v.getInst().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spVeiInst, "Desconhecido");
		}
    	try{
    		setAdapterPositionFromString(spVeiEquipamento,v.getEquipamento().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spVeiEquipamento, "Desconhecido");
		}
    	try{
    		setAdapterPositionFromString(spVeiEquipe,v.getEquipe().toString());
    	}catch (NullPointerException e) {
    		setAdapterPositionFromString(spVeiEquipe, "Desconhecido");
		}
    	
    	
    	
    	
    	salvar.setOnClickListener(new OnClickListener() {
    		@Override
			public void onClick(View view) {
    			MainActivity.listaVeiculos.remove(v);
    			
    			v.setIdentificacao(getStringEditText(etVeiIdentificacao));
    			
    			v.setTipoDeVeiculo(spVeiTipoDeVeiculo.getSelectedItem().toString());
    			
    			String subtipoVei = "Desconhecido";
				if (!spVeiTipoDeVeiculo.getSelectedItem().equals("Desconhecido")){
					subtipoVei = spVeiSubtipo.getSelectedItem().toString();
				}
				v.setSubtipo(subtipoVei);
				
				String textoBalao = subtipoVei;
				
				Equipe eqp = null;
				for (Equipe e : listaEquipes) {
					if (spVeiEquipe.getSelectedItem().equals(e.toString())){
						eqp = e;
					}else{
						continue;
					}
				}
				
				Equipamento eqm = null;
				for (Equipamento equip : listaEquipamentos) {
					if (spVeiEquipamento.getSelectedItem().equals(equip.toString())){
						eqm = equip;
					}else{
						continue;
					}
				}
				
				Instituicao in = null;
				for (Instituicao i : listaInstituicoes) {
					if (spVeiInst.getSelectedItem().equals(i.toString())){
						in = i;
					}else{
						continue;
					}
				}
				
				if (in != null) textoBalao += ", " + in.getTipoDeInstituicao();
				if (eqm != null) textoBalao += "\nEquipamento: " + eqm.toString();
				if (eqp != null) textoBalao += "\nEquipe: " + eqp.toString();
				
				v.setEquipe(eqp);
				v.setEquipamento(eqm);
				v.setInst(in);
				v.setTextoBalao(textoBalao);
				
				try{
					eqm.setVeiculo(v);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}
    			
				atualizaObj(v);
            	finish();
    			Global.editarPDI=false;
    			MainActivity.exibeToast(getApplicationContext(), "Dados atualizados");
    		}
    	});
	}
	
	
	/**
	 * Este método aplicará a um spinner um ArrayAdapter populado pelos toStrings de cada PDI contido numa lista de PDIs
	 * @param aAdapter ArrayAdapter que será aplicado no Spinner
	 * @param sp Spinner que receberá os toStrings dos PDIs
	 * @param l Lista de PDIs a serem adicionados ao ArrayAdapter
	 */
	private void setPDIArrayAdapter(ArrayAdapter<CharSequence> aAdapter, Spinner sp, List<?> l){
		aAdapter = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
		aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
		sp.setAdapter(aAdapter);
        if(l.size() < 1){
        	aAdapter.add("Desconhecido");
        }else{
        	aAdapter.add("Desconhecido");
	        for (int j = 0; j < l.size(); j++) {
	        	aAdapter.add(l.get(j).toString());
			}
    	}
	}
	
	public void setAdapterPositionFromString(Spinner spinner, String texto){
		@SuppressWarnings({ "unchecked", "rawtypes" })
		ArrayAdapter<CharSequence> adapter = (ArrayAdapter) spinner.getAdapter();
		try{
			int pos = adapter.getPosition(texto);
			spinner.setSelection(pos);
		}catch(NullPointerException exc){
			spinner.setSelection(0);
		}
	}
	
	public void setAdapterPositionFromString(ArrayAdapter<CharSequence> adapter, Spinner spinner, String texto){
		try{
			int pos = adapter.getPosition(texto);
			spinner.setSelection(pos);
		}catch(NullPointerException exc){
			spinner.setSelection(0);
		}
	}

	public static void atualizaObj(Veiculo v){
		MainActivity.veiculoOverlays.clear();
		for (Veiculo vei : MainActivity.listaVeiculos) {
			if(!vei.equals(v)){
				MainActivity.veiculoOverlays.addOverlay(vei.getOverlayItem(), vei);
			}
		}
		MainActivity.veiculoOverlays.addOverlay(v.getOverlayItem(), v);
		MainActivity.listaVeiculos.add(v);
		MainActivity.veiculoOverlays.hideBalloon();
		
	}

	public void deletaObj(final Veiculo v){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Excluir Veículo")
		       .setMessage("Tem certeza?")
		       .setCancelable(false)
		       .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	   ArrayList<PDI> links = Global.getArrayDeLinks(v);
		        	   if(!links.equals(null) && links.size()>0){
		        		   for (PDI pdi : links) {
		        			   if(pdi instanceof Equipamento){
		        				   Equipamento e = (Equipamento) pdi;
		        				   e.setVeiculo(null);
		        				   e.atualizaTextoBalao();
		        				   NovoEquipamento.atualizaObj(e);
		        			   }
		        		   }
		        	   }
		        	   
		        	   MainActivity.veiculoOverlays.clear();
		        	   MainActivity.listaVeiculos.remove(v);
		        	   for (Veiculo vei : MainActivity.listaVeiculos) {
		        		   MainActivity.veiculoOverlays.addOverlay(vei.getOverlayItem(), vei);
		        	   }
		        	   MainActivity.veiculoOverlays.hideBalloon();
		        	   finish();
		        	   Global.editarPDI=false;
		           }
		       })
		       .setNegativeButton("Não", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       });
		builder.show();
	}
	
	public String getStringEditText(EditText et){
		if (et.getText().toString().equals("")) return "Desconhecido";
		return et.getText().toString();
	}
	
	@Override
	public void onBackPressed() {
		Global.editarPDI=false;
		super.onBackPressed();
	}
}
